import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.applications import VGG16

vgg16 = VGG16(weights='imagenet',# 'none' is random'imagenet' is optimized
              include_top = False, # Only the convolutional section
              input_shape = (150,150,3))

train_data_dir = 'Datasets/DogsCats/train'
validation_data_dir = 'Datasets/DogsCats/validation'
    
def get_dogsCats_activations_fromVGG16(source_dir, num_features):
    activations = np.zeros((num_features, 4, 4, 512)) # block5_pool shape
    labels = np.zeros((num_features,))
    
    img_generator = ImageDataGenerator(rescale = 1./255.)
    batch_size = 32
    
    generator = img_generator.flow_from_directory(
        train_data_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='binary')
        
    i = num_features//batch_size - 1
    for input_batch, label_batch in generator:
        # each image enters in the vgg16 model
        output_batch = vgg16.predict(input_batch)
        # vgg16 exit activations   
        activations[i*batch_size:(i+1)*batch_size] = output_batch  
        labels[i*batch_size:(i+1)*batch_size] = label_batch # labels
        i -= 1
        if i == -1:
            break
            
    return activations, labels
    
train_activations, train_labels =
                   get_dogsCats_activations_fromVGG16(train_data_dir,4096)
validation_activations, validation_labels =
              get_dogsCats_activations_fromVGG16(validation_data_dir,1024)
